//
//  DMAnalytics.h
//  DualMediationSDK
//
//  Created by AI Assistant
//  Copyright © 2024 YourCompany. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "../Utils/Logger/IMLogUtils.h"

NS_ASSUME_NONNULL_BEGIN

/**
 * 事件类型
 */
typedef NS_ENUM(NSUInteger, DMEventType) {
    DMEventTypeInitialization = 0,   // 初始化事件
    DMEventTypeAdRequest,            // 广告请求
    DMEventTypeAdLoad,               // 广告加载
    DMEventTypeAdShow,               // 广告展示
    DMEventTypeAdClick,              // 广告点击
    DMEventTypeAdClose,              // 广告关闭
    DMEventTypeAdRevenue,            // 广告收入
    DMEventTypeError,                // 错误事件
    DMEventTypeCustom                // 自定义事件
};

/**
 * 广告事件
 */
@interface DMAdEvent : NSObject
@property (nonatomic, strong) NSString *eventId;
@property (nonatomic, assign) DMEventType eventType;
@property (nonatomic, strong) NSString *placementId;
@property (nonatomic, strong) NSString *platform;
@property (nonatomic, strong) NSString *adType;
@property (nonatomic, strong, nullable) NSString *adId;
@property (nonatomic, strong) NSDate *timestamp;
@property (nonatomic, strong, nullable) NSDictionary *metadata;
@property (nonatomic, strong, nullable) NSNumber *revenue;
@property (nonatomic, strong, nullable) NSString *currency;
@end

/**
 * 性能指标
 */
@interface DMPerformanceMetrics : NSObject
@property (nonatomic, assign) NSTimeInterval loadTime;
@property (nonatomic, assign) NSTimeInterval showTime;
@property (nonatomic, assign) double fillRate;
@property (nonatomic, assign) double clickRate;
@property (nonatomic, assign) double eCPM;
@property (nonatomic, assign) NSUInteger impressions;
@property (nonatomic, assign) NSUInteger clicks;
@property (nonatomic, assign) NSUInteger errors;
@property (nonatomic, strong) NSDate *calculatedAt;
@end

/**
 * AB测试事件
 */
@interface DMABTestEvent : NSObject
@property (nonatomic, strong) NSString *experimentId;
@property (nonatomic, strong) NSString *variantId;
@property (nonatomic, strong) NSString *eventType;
@property (nonatomic, strong) NSString *userId;
@property (nonatomic, strong) NSDate *timestamp;
@property (nonatomic, strong, nullable) NSDictionary *properties;
@end

/**
 * DM分析管理器 - 运营数据与AB实验
 * 
 * 核心特性：
 * 1. 广告事件追踪和数据收集
 * 2. 性能指标计算和监控
 * 3. AB测试数据统计
 * 4. 实时数据上报
 * 5. 本地数据缓存和批量上传
 * 6. 数据隐私保护
 * 7. 自定义事件支持
 * 8. 数据可视化支持
 */
@interface DMAnalytics : NSObject

#pragma mark - Singleton

/**
 * 获取单例实例
 */
+ (instancetype)sharedAnalytics;

#pragma mark - Initialization

/**
 * 初始化分析系统
 * @param config 分析配置
 */
- (void)initializeWithConfig:(NSDictionary *)config;

/**
 * 检查是否已初始化
 */
@property (nonatomic, readonly) BOOL isInitialized;

#pragma mark - Configuration

/**
 * 启用/禁用数据收集
 */
@property (nonatomic, assign) BOOL dataCollectionEnabled;

/**
 * 设置用户ID
 * @param userId 用户ID
 */
- (void)setUserId:(nullable NSString *)userId;

/**
 * 设置用户属性
 * @param properties 用户属性
 */
- (void)setUserProperties:(NSDictionary *)properties;

/**
 * 设置自动上报间隔（秒）
 */
@property (nonatomic, assign) NSTimeInterval autoReportInterval;

/**
 * 启用/禁用自动上报
 */
@property (nonatomic, assign) BOOL autoReportEnabled;

/**
 * 设置数据上报URL
 * @param url 上报URL
 */
- (void)setReportURL:(nullable NSURL *)url;

#pragma mark - Ad Event Tracking

/**
 * 追踪广告初始化事件
 * @param platform 聚合平台
 * @param success 是否成功
 * @param metadata 额外数据
 */
- (void)trackAdInitialization:(NSString *)platform success:(BOOL)success metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪广告请求事件
 * @param placementId 广告位ID
 * @param platform 聚合平台
 * @param adType 广告类型
 * @param metadata 额外数据
 */
- (void)trackAdRequest:(NSString *)placementId platform:(NSString *)platform adType:(NSString *)adType metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪广告加载事件
 * @param placementId 广告位ID
 * @param platform 聚合平台
 * @param adType 广告类型
 * @param adId 广告ID
 * @param success 是否成功
 * @param loadTime 加载时间（秒）
 * @param metadata 额外数据
 */
- (void)trackAdLoad:(NSString *)placementId platform:(NSString *)platform adType:(NSString *)adType adId:(nullable NSString *)adId success:(BOOL)success loadTime:(NSTimeInterval)loadTime metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪广告展示事件
 * @param placementId 广告位ID
 * @param platform 聚合平台
 * @param adType 广告类型
 * @param adId 广告ID
 * @param revenue 收入信息（可选）
 * @param metadata 额外数据
 */
- (void)trackAdShow:(NSString *)placementId platform:(NSString *)platform adType:(NSString *)adType adId:(NSString *)adId revenue:(nullable NSDictionary *)revenue metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪广告点击事件
 * @param placementId 广告位ID
 * @param platform 聚合平台
 * @param adType 广告类型
 * @param adId 广告ID
 * @param metadata 额外数据
 */
- (void)trackAdClick:(NSString *)placementId platform:(NSString *)platform adType:(NSString *)adType adId:(NSString *)adId metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪广告关闭事件
 * @param placementId 广告位ID
 * @param platform 聚合平台
 * @param adType 广告类型
 * @param adId 广告ID
 * @param showTime 展示时长（秒）
 * @param metadata 额外数据
 */
- (void)trackAdClose:(NSString *)placementId platform:(NSString *)platform adType:(NSString *)adType adId:(NSString *)adId showTime:(NSTimeInterval)showTime metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪广告收入事件
 * @param placementId 广告位ID
 * @param platform 聚合平台
 * @param adType 广告类型
 * @param adId 广告ID
 * @param revenue 收入金额
 * @param currency 货币类型
 * @param metadata 额外数据
 */
- (void)trackAdRevenue:(NSString *)placementId platform:(NSString *)platform adType:(NSString *)adType adId:(NSString *)adId revenue:(double)revenue currency:(NSString *)currency metadata:(nullable NSDictionary *)metadata;

/**
 * 追踪错误事件
 * @param placementId 广告位ID（可选）
 * @param platform 聚合平台（可选）
 * @param adType 广告类型（可选）
 * @param error 错误信息
 * @param metadata 额外数据
 */
- (void)trackError:(nullable NSString *)placementId platform:(nullable NSString *)platform adType:(nullable NSString *)adType error:(NSError *)error metadata:(nullable NSDictionary *)metadata;

#pragma mark - Custom Event Tracking

/**
 * 追踪自定义事件
 * @param eventName 事件名称
 * @param properties 事件属性
 */
- (void)trackCustomEvent:(NSString *)eventName properties:(nullable NSDictionary *)properties;

/**
 * 追踪自定义事件（带值）
 * @param eventName 事件名称
 * @param value 事件值
 * @param properties 事件属性
 */
- (void)trackCustomEvent:(NSString *)eventName value:(nullable NSNumber *)value properties:(nullable NSDictionary *)properties;

#pragma mark - A/B Testing

/**
 * 追踪AB测试实验开始
 * @param experimentId 实验ID
 * @param variantId 变体ID
 * @param userId 用户ID
 */
- (void)trackABTestStart:(NSString *)experimentId variantId:(NSString *)variantId userId:(NSString *)userId;

/**
 * 追踪AB测试转化事件
 * @param experimentId 实验ID
 * @param variantId 变体ID
 * @param userId 用户ID
 * @param eventType 事件类型
 * @param properties 事件属性
 */
- (void)trackABTestConversion:(NSString *)experimentId variantId:(NSString *)variantId userId:(NSString *)userId eventType:(NSString *)eventType properties:(nullable NSDictionary *)properties;

/**
 * 获取AB测试统计数据
 * @param experimentId 实验ID
 */
- (nullable NSDictionary *)getABTestStatistics:(NSString *)experimentId;

#pragma mark - Performance Metrics

/**
 * 获取广告位性能指标
 * @param placementId 广告位ID
 * @param platform 聚合平台（可选）
 * @param timeRange 时间范围（小时数）
 */
- (nullable DMPerformanceMetrics *)getPerformanceMetrics:(NSString *)placementId platform:(nullable NSString *)platform timeRange:(NSTimeInterval)timeRange;

/**
 * 获取平台性能对比
 * @param adType 广告类型
 * @param timeRange 时间范围（小时数）
 */
- (NSDictionary<NSString *, DMPerformanceMetrics *> *)getPlatformComparison:(NSString *)adType timeRange:(NSTimeInterval)timeRange;

/**
 * 获取收入统计
 * @param timeRange 时间范围（小时数）
 * @param groupBy 分组方式 ("platform", "adType", "placement")
 */
- (NSDictionary *)getRevenueStatistics:(NSTimeInterval)timeRange groupBy:(NSString *)groupBy;

/**
 * 获取填充率统计
 * @param timeRange 时间范围（小时数）
 * @param groupBy 分组方式
 */
- (NSDictionary *)getFillRateStatistics:(NSTimeInterval)timeRange groupBy:(NSString *)groupBy;

#pragma mark - Data Export

/**
 * 导出事件数据
 * @param startDate 开始时间
 * @param endDate 结束时间
 * @param eventTypes 事件类型过滤（可选）
 * @param format 导出格式 ("json", "csv")
 * @param completion 完成回调
 */
- (void)exportEventData:(NSDate *)startDate endDate:(NSDate *)endDate eventTypes:(nullable NSArray<NSNumber *> *)eventTypes format:(NSString *)format completion:(void(^)(NSData * _Nullable data, NSError * _Nullable error))completion;

/**
 * 导出性能报告
 * @param startDate 开始时间
 * @param endDate 结束时间
 * @param format 导出格式
 * @param completion 完成回调
 */
- (void)exportPerformanceReport:(NSDate *)startDate endDate:(NSDate *)endDate format:(NSString *)format completion:(void(^)(NSData * _Nullable data, NSError * _Nullable error))completion;

#pragma mark - Data Management

/**
 * 获取本地存储的事件数量
 */
- (NSUInteger)getLocalEventCount;

/**
 * 获取本地存储数据大小（字节）
 */
- (NSUInteger)getLocalDataSize;

/**
 * 手动上报数据
 * @param completion 完成回调
 */
- (void)flushData:(nullable void(^)(BOOL success, NSError * _Nullable error))completion;

/**
 * 清除本地数据
 * @param olderThan 清除指定时间之前的数据（可选）
 */
- (void)clearLocalData:(nullable NSDate *)olderThan;

/**
 * 设置数据保留期（天数）
 */
@property (nonatomic, assign) NSUInteger dataRetentionDays;

#pragma mark - Real-time Monitoring

/**
 * 启用实时监控
 * @param enabled 是否启用
 */
- (void)setRealTimeMonitoringEnabled:(BOOL)enabled;

/**
 * 设置实时监控阈值
 * @param thresholds 阈值配置
 */
- (void)setMonitoringThresholds:(NSDictionary *)thresholds;

/**
 * 获取实时监控状态
 */
- (NSDictionary *)getRealTimeMonitoringStatus;

#pragma mark - Privacy & Compliance

/**
 * 设置隐私模式
 * @param enabled 是否启用
 */
- (void)setPrivacyModeEnabled:(BOOL)enabled;

/**
 * 删除用户数据
 * @param userId 用户ID
 * @param completion 完成回调
 */
- (void)deleteUserData:(NSString *)userId completion:(nullable void(^)(BOOL success, NSError * _Nullable error))completion;

/**
 * 获取数据收集状态
 */
- (NSDictionary *)getDataCollectionStatus;

#pragma mark - Debug & Utilities

/**
 * 启用调试模式
 * @param enabled 是否启用
 */
- (void)setDebugMode:(BOOL)enabled;

/**
 * 获取调试信息
 */
- (NSDictionary *)getDebugInfo;

/**
 * 验证事件数据
 * @param event 事件数据
 */
- (BOOL)validateEvent:(NSDictionary *)event error:(NSError **)error;

@end

NS_ASSUME_NONNULL_END 